// Promise的使用 >>> 使用setTimeout进行模拟

// setTimeout(() => {
//   console.log("您已等待一秒");
// }, 1000);


// 参数为两个函数
// resolve : 成功回调
// reject  : 失败回调  
/*
new Promise((resolve, reject) => {
  // 1.
  setTimeout(() => {
    console.log("Hello World 1");
    console.log("Hello World 2");
    console.log("Hello World 3\n");

    // 2.
    setTimeout(() => {
      console.log("Hello VueJs 1");
      console.log("Hello VueJs 2");
      console.log("Hello VueJs 3\n");

      // 3.
      setTimeout(() => {
        console.log("Hello Python 1");
        console.log("Hello Python 2");
        console.log("Hello Python 3\n");
      }, 1000)

    }, 1000);

  }, 1000)
});
*/

// 使用Promise优化代码
// [链式编程]
new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve();
  })
}).then(() => {
  // 第一次网络请求代码
  console.log("1 Hello Word");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, 1000);
  })
}).then(() => {
  // 第二次网络请求代码
  console.log("2 Hello VueJs");
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, 1000);
  })
}).then(() => {
  // 第三次网络请求代码
  console.log("3 Hello Python");
})


// 什么情况下会用到Promise？
// 一般情况是有异步操作时，使用Promise对这个异步操作进行封装。
// 因为resolve与reject本身又是一个函数，也可以传递参数 .then((接收参数1, 接收参数2, ...) => {})

new Promise((resolve, reject) => {
  setTimeout(() => {
    // 成功回调
    // resolve('Hello World');

    // 失败回调
    reject('Bad World');
  }, 3000);
})
  .then((res) => console.log("[成功] >>>", res))
  .catch((err) => console.log("[失败] >>>", err))